package com.zusmart.core.bean;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Set;

import com.zusmart.core.bean.cause.BeanDefinitionMultipleException;
import com.zusmart.core.bean.cause.BeanDefinitionNotFoundException;
import com.zusmart.core.bean.cause.BeanDefinitionReferenceCycleException;
import com.zusmart.core.bean.cause.BeanInstanceInjectException;

public interface BeanDefinitionResolver {

	/**
	 * 通过class解析出BeanName
	 * 
	 * @param beanClass
	 *            目标Bean类
	 * @return beanName 名称
	 */
	public String getBeanName(Class<?> beanClass);

	/**
	 * 通过object解析出BeanNane
	 * 
	 * @param beanInstance
	 *            目标Bean实例
	 * @return beanName 名称
	 */
	public String getBeanName(Object beanInstance);

	/**
	 * 通过method解析出BeanName
	 * 
	 * @param parentBeanMethod
	 *            目标Bean实例化方法
	 * @return beanName 名称
	 */
	public String getBeanName(Method parentBeanMethod);

	/**
	 * 通过class解析出BeanScope
	 * 
	 * @param beanClass
	 *            目标Bean类
	 * @return beanScope
	 */
	public String getBeanScope(Class<?> beanClass);

	/**
	 * 通过method解析出BeanScope
	 * 
	 * @param parentBeanMethod
	 *            目标Bean实例化方法
	 * @return beanScope
	 */
	public String getBeanScope(Method parentBeanMethod);

	/**
	 * 通过class解析出构造函数
	 * 
	 * @param beanClass
	 *            目标Bean类
	 * @return 构造函数
	 */
	public Constructor<?> getBeanConstructor(Class<?> beanClass);

	/**
	 * 通过构造函数解析出参数
	 * 
	 * @param constructor
	 *            构造函数
	 * @return 参数数组
	 * @throws BeanDefinitionNotFoundException
	 *             指定参数Bean实例未找到时,抛出此异常
	 */
	public Object[] getBeanArguments(Constructor<?> constructor) throws BeanDefinitionNotFoundException;

	/**
	 * 通过method解析出参数
	 * 
	 * @param method
	 *            目标方法
	 * @return 参数数组
	 * @throws BeanDefinitionNotFoundException
	 *             指定参数Bean实例未找到时,抛出此异常
	 */
	public Object[] getBeanArguments(Method method) throws BeanDefinitionNotFoundException;

	/**
	 * 获取初始化方法
	 * 
	 * @param beanClass
	 *            Bean类
	 * @return 初始化方法数组
	 */
	public Method[] getInitialMethod(Class<?> beanClass);

	/**
	 * 获取销毁方法
	 * 
	 * @param beanClass
	 *            Bean类
	 * @return 销毁方法数组
	 */
	public Method[] getDestoryMethod(Class<?> beanClass);

	/**
	 * 属性注入
	 * 
	 * @param beanClass
	 *            Bean类
	 * @param beanInstance
	 *            Bean实例
	 * @throws BeanInstanceInjectException 注入异常
	 */
	public void injectField(Class<?> beanClass, Object beanInstance) throws BeanInstanceInjectException;

	/**
	 * 方法注入
	 * 
	 * @param beanClass
	 *            Bean类
	 * @param beanInstance
	 *            Bean实例
	 * @throws BeanInstanceInjectException
	 *             注入异常
	 */
	public void inejctMethod(Class<?> beanClass, Object beanInstance) throws BeanInstanceInjectException;

	/**
	 * 获取排序后的BeanDefinition集合 1.处理condition 2.处理referenceCycle
	 * 
	 * @return 排序后的BeanDifinition 1.处理condition 2.处理referenceCycle
	 */
	public Set<BeanDefinition> getSortedBeanDefinitions() throws BeanDefinitionReferenceCycleException, BeanDefinitionNotFoundException, BeanDefinitionMultipleException;

	/**
	 * 获取指定class的代理
	 * 
	 * @param beanClass Bean类
	 * @return 代理的目标类
	 * @throws BeanDefinitionNotFoundException Bean信息不存在
	 */
	public Set<BeanDefinition> getBeanDefinitionProxy(Class<?> beanClass) throws BeanDefinitionNotFoundException;

	/**
	 * 
	 * @return 获取Bean注册器
	 */
	public BeanDefinitionRegistry getBeanDefinitionRegistry();

}